package com.loong.coupon.common.backend.param;

import com.loong.common.validator.group.CommonInsert;
import com.loong.common.validator.group.CommonUpdate;
import lombok.*;

import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 优惠券
 */
@Builder
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class CouponParam {

    /**
     * 优惠券id
     */
    @NotNull(message = "更新优惠券不能为空",groups = {CommonUpdate.class})
    private Long id;

    /**
     * 优惠券名称
     */
    @NotBlank(message = "新增优惠券名称不能为空",groups = {CommonInsert.class})
    private String couponName;

    /**
     * 面额
     */
    @NotNull(message = "新增优惠券面额不能为空",groups = {CommonInsert.class})
    @DecimalMin(value = "0",groups = {CommonInsert.class})
    private BigDecimal couponMoney;

    /**
     * 优惠券颜色
     */
    @NotNull(message = "新增时优惠券颜色不能为空",groups = {CommonInsert.class})
    private Integer color;

    /**
     * 满减条件
     */
    @NotNull(message = "新增时满减价格不能为空",groups = {CommonInsert.class})
    @DecimalMin(value = "0",groups = {CommonInsert.class})
    private BigDecimal discountCondition;

    /**
     * 有效类型(0领取后生效,1固定时间有效)
     */
    @NotNull(message = "新增时优惠券有效类型不能为空",groups = {CommonInsert.class})
    private Boolean validType;

    //TODO 当validType的值为true时，下面的有效天数必传，当值为false时，下面的有效起始时间和结束时间必传。如何进行跨字段校验？

    /**
     * 有效天数
     */
    private Integer validDay;

    /**
     * 有效起始时间
     */
    private Date validStartTime;

    /**
     * 有效结束时间
     */
    private Date validEndTime;

    /**
     * 发放总数
     */
    @NotNull(message = "新增时优惠券发放总数不能为空",groups = {CommonInsert.class})
    private Integer totalNum;

    /**
     * 领取数量
     */
    private Integer takeNum;

    /**
     * 使用数量
     */
    private Integer useNum;

    /**
     * 用户限领数量(人/张)
     */
    @NotNull(message = "新增时用户限领优惠券数量不能为空",groups = {CommonInsert.class})
    @Min(value = 1,groups = {CommonInsert.class})
    private Integer restrictNum;

    /**
     * 优惠平台id
     */
    @NotNull(message = "新增时优惠平台id不能为空",groups = {CommonInsert.class})
    private Long discountPlatformId;

    /**
     * 优惠券来源
     */
    @NotNull(message = "新增时优惠券来源不能为空",groups = {CommonInsert.class})
    private Integer couponSource;

    /**
     * 是否可退(0不可退,1可退)
     */
    @NotNull(message = "新增时优惠券是否可退不能为空",groups = {CommonInsert.class})
    private Boolean returnBackYes;

    /**
     * 优惠券类型
     */
    @NotNull(message = "新增时优惠券类型不能为空",groups = {CommonInsert.class})
    private Integer couponType;

    /**
     * 状态(1待审核,2审核未通过,3审核已通过(生效),4失效)
     */
    private Integer status;

    /**
     * 是否可叠加使用
     */
    @NotNull(message = "新增时优惠券是否可叠加适用不能为空",groups = {CommonInsert.class})
    private Boolean appendYes;

    /**
     * 描述
     */
    private String description;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    private Date lastUpdateTime;
}